#include "BlockQueue.hpp"
#include "Task.hpp"

struct ThreadData
{
    BlockQueue<Task> *_bq;
    // BlockQueue<int> *_bq;
    std::string _name;
};

void* consumer(void* args)
{
    ThreadData* td = static_cast<ThreadData*>(args);
    while(true)
    {
        sleep(1);
        // int data = 0;
        // td->_bq->Pop(&data);
        // std::cout << td->_name << "消费了一个数据: " << data << std::endl;

        //获取
        Task t;
        td->_bq->Pop(&t);
        //处理
        t();
        t.Print();
    }
}


void* productor(void* args)
{
    ThreadData* td = static_cast<ThreadData*>(args);
    int data = 1;
    while(true)
    {
        // sleep(1);
        // td->_bq->Push(data);
        // std::cout << td->_name << "生产了一个数据: " << data++ << std::endl;

        //生产
        int x = data, y = data + 1;
        Task t(x, y);
        data++;
        //写入
        td->_bq->Push(t);
        std::cout << "生产者执行了一个任务" << std::endl;
    }
}

int main()
{
    BlockQueue<Task> *bq = new BlockQueue<Task>(); // 交易场所
    pthread_t c, p;// 单生产者单消费者
    // pthread_t c[2], p[5];// 多生产者多消费者

    ThreadData ctd = {bq, "消费者"};
    pthread_create(&c, nullptr, consumer, (void *)&ctd);
    // pthread_create(c+0, nullptr, consumer, (void*)&ctd);
    // pthread_create(c+1, nullptr, consumer, (void*)&ctd);

    ThreadData ptd = {bq, "生产者"};
    pthread_create(&p, nullptr, productor, (void *)&ptd);
    // pthread_create(p+0, nullptr, productor, (void *)&ptd);
    // pthread_create(p+1, nullptr, productor, (void *)&ptd);
    // pthread_create(p+2, nullptr, productor, (void *)&ptd);
    // pthread_create(p+3, nullptr, productor, (void *)&ptd);
    // pthread_create(p+4, nullptr, productor, (void *)&ptd);

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);

    // pthread_join(c[0], nullptr);
    // pthread_join(c[1], nullptr);
    // pthread_join(p[0], nullptr);
    // pthread_join(p[1], nullptr);
    // pthread_join(p[2], nullptr);
    // pthread_join(p[3], nullptr);
    // pthread_join(p[4], nullptr);

    return 0;
}